// 微信登录鉴权服务
import type { LoginResult, ThirdShortLoginParams } from '@/types/userInfo'
import { postThirdShortLoginAPI, postLoginMobileNoCodeAPI } from '@/api/login'
import { useUserInfoStore } from '@/stores'
import { getUserTag } from '@/api/user'

let aweixin: any = null
let isSupport: boolean = false
const errorList = {
  30005: '不具备一键登录的使用前提，设备不支持/未开启数据流量/其他原因',
  20202: '终端未开启SIM流量,手动开启设备流量',
  5000: '请检查SIM卡是否停机欠费',
}

const auths: Record<string, any> = {}
async function getService() {
  console.log('getService')
  // #ifdef APP-PLUS
  plus.oauth.getServices(
    function (services: any) {
      for (const i in services) {
        const service = services[i]
        if (service.id) {
          auths[service.id] = service as { id: string }
        }
      }
      if (auths.weixin) {
        aweixin = auths.weixin
      }
    },
    function (e) {
      plus.nativeUI.alert(`获取登录鉴权服务列表失败：${JSON.stringify(e)}`)
    },
  )
  // #endif
}

async function fFilterOauth(id: string) {
  return auths[id]
}

const loginSuccess = async (profile: LoginResult) => {
  // 保存会员信息
  const UserInfoStore = useUserInfoStore()
  UserInfoStore.setProfile(profile)
  // 成功提示
  uni.hideLoading()
  console.log('获取getUserTag')
  const result = await getUserTag()
  console.log(result)
  if (result.code) {
    console.log(result.data)
    if (result.data.length > 0) {
      uni.redirectTo({
        url: '/pages/profile/profile',
      })
    } else {
      uni.redirectTo({
        url: '/pages/welcome/welcome',
      })
    }
  }
}

async function ThirdLogin(Third: any, type: string) {
  uni.showLoading({
    title: '正在登录...',
    icon: 'none',
  })
  Third.login(
    async function (res: any) {
      console.log(`登录认证成功：${JSON.stringify(res)}`)
      let userInfo = {}
      switch (type) {
        case 'weixin':
          userInfo = {
            openid: res.target.authResult.openid,
            nickname: res.target.userInfo.nickname,
            sex: res.target.userInfo.sex,
            language: res.target.userInfo.language,
            city: res.target.userInfo.city,
            province: res.target.userInfo.province,
            country: res.target.userInfo.country,
            avatar: res.target.userInfo.headimgurl
              ? res.target.userInfo.headimgurl
              : '/static/default-avatar.png',
            unionid: res.target.userInfo.unionid,
          }
          break
        case 'qq':
          userInfo = {
            openid: res.target.authResult.openid,
            nickname: res.target.userInfo.nickname,
            gender: res.target.userInfo.gender,
            province: res.target.userInfo.province,
            city: res.target.userInfo.city,
            avatar: res.target.userInfo.headimgurl
              ? res.target.userInfo.headimgurl
              : '/static/default-avatar.png',
            unionid: res.target.userInfo.unionid,
          }
          break
        case 'sinaweibo':
          userInfo = {
            openid: res.target.authResult.openid,
            avatar: '/static/default-avatar.png',
          }
          break
        default:
          break
      }
      const params = {
        platform: type,
        userInfo,
      }

      console.log(JSON.stringify(params))
      const result = await postThirdShortLoginAPI(params as ThirdShortLoginParams)
      console.log(result)
      if (result.code) {
        loginSuccess(result.data)
        univerifyManager.close()
      }
    },
    function (e: any) {
      console.log(`登录认证失败：${JSON.stringify(e)}`)
      uni.showToast({
        title: '登录认证失败',
      })
    },
  )
}

async function ThirdLoginCallback(res: {
  provider: string
  code: string
  message: string
  index: number
}) {
  console.log(res)
  const Third = await fFilterOauth(res.provider)
  console.log(Third)
  if (Third) {
    await ThirdLogin(Third, res.provider)
  }
}

// #ifdef APP-PLUS
const univerifyManager = uni.getUniverifyManager()
univerifyManager.onButtonsClick(ThirdLoginCallback)
// #endif
const appShareUrl = ''
const univerifyStyle = {
  fullScreen: true, // 是否全屏显示，默认值： false
  backgroundColor: '#ffffff', // 授权页面背景颜色，默认值：#ffffff
  backgroundImage: '', // 全屏显示的背景图片，默认值："" （仅支持本地图片，只有全屏显示时支持）
  icon: {
    path: 'static/logo_icon.png', // 自定义显示在授权框中的logo，仅支持本地图片 默认显示App logo
  },
  closeIcon: {
    path: 'static/xxx.png', // 自定义关闭按钮，仅支持本地图片。 HBuilderX3.3.7+版本支持
  },
  phoneNum: {
    color: '#202020', // 手机号文字颜色 默认值：#202020
  },
  slogan: {
    color: '#BBBBBB', //  slogan 字体颜色 默认值：#BBBBBB
  },
  authButton: {
    normalColor: '#28bb9c', // 授权按钮正常状态背景颜色 默认值：#3479f5
    highlightColor: '#303841', // 授权按钮按下状态背景颜色 默认值：#2861c5（仅ios支持）
    disabledColor: '#303841', // 授权按钮不可点击时背景颜色 默认值：#73aaf5（仅ios支持）
    textColor: '#ffffff', // 授权按钮文字颜色 默认值：#ffffff
    title: '本机号码一键登录', // 授权按钮文案 默认值：“本机号码一键登录”
    borderRadius: '24px', // 授权按钮圆角 默认值："24px" （按钮高度的一半）
  },
  otherLoginButton: {
    visible: true, // 是否显示其他登录按钮，默认值：true
    normalColor: '', // 其他登录按钮正常状态背景颜色 默认值：透明
    highlightColor: '', // 其他登录按钮按下状态背景颜色 默认值：透明
    textColor: '#656565', // 其他登录按钮文字颜色 默认值：#656565
    title: '其他登录方式', // 其他登录方式按钮文字 默认值：“其他登录方式”
    borderColor: '', // 边框颜色 默认值：透明（仅iOS支持）
    borderRadius: '0px', // 其他登录按钮圆角 默认值："24px" （按钮高度的一半）
  },
  privacyTerms: {
    defaultCheckBoxState: false, // 条款勾选框初始状态 默认值： true
    uncheckedImage: '', // 可选 条款勾选框未选中状态图片（仅支持本地图片 建议尺寸 24x24px）(3.2.0+ 版本支持)
    checkedImage: '', // 可选 条款勾选框选中状态图片（仅支持本地图片 建议尺寸24x24px）(3.2.0+ 版本支持)
    checkBoxSize: 14, // 可选 条款勾选框大小，仅android支持
    textColor: '#BBBBBB', // 文字颜色 默认值：#BBBBBB
    termsColor: '#313743', //  协议文字颜色 默认值： #5496E3
    prefix: '我已阅读并同意', // 条款前的文案 默认值：“我已阅读并同意”
    suffix: '并使用本机号码登录', // 条款后的文案 默认值：“并使用本机号码登录”
    privacyItems: [
      // 自定义协议条款，最大支持2个，需要同时设置url和title. 否则不生效
      {
        url: `${appShareUrl}privacy.html`, // 点击跳转的协议详情页面
        title: '《隐私政策》', // 协议名称
      },
      {
        url: `${appShareUrl}contract.html`, // 点击跳转的协议详情页面
        title: '《服务协议》', // 协议名称
      },
    ],
  },
  buttons: {
    // 自定义页面下方按钮仅全屏模式生效（3.1.14+ 版本支持）
    iconWidth: '45px', // 图标宽度（高度等比例缩放） 默认值：45px
    list: [
      // {
      //   provider: 'qq',
      //   iconPath: '/static/icon/qq.png', // 图标路径仅支持本地图片
      // },
      {
        provider: 'weixin',
        iconPath: '/static/icon/weixin.png', // 图标路径仅支持本地图片
      },
    ],
  },
}

async function univerifyLogin() {
  // univerifyManager.preLogin({
  //   provider: 'univerify'
  // });
  console.log('univerifyLogin')
  univerifyManager.login({
    univerifyStyle,
    success: (res: any) => {
      console.log('login success', JSON.stringify(res))
      // const resJson = JSON.parse(res);
      if (res.errMsg === 'login:ok') {
        const openid = res?.authResult?.openid
        const access_token = res?.authResult?.access_token
        console.log('openid', openid)
        console.log('accessToken', access_token)
        uni.showLoading({
          title: '正在登录...',
          icon: 'none',
        })
        uniCloud
          .callFunction({
            name: 'getPhoneNumber',
            data: {
              openid: openid,
              access_token: access_token,
            },
          })
          .then(async (res) => {
            console.log(res)
            console.log('getPhoneNumber success', res)

            const result = await postLoginMobileNoCodeAPI({ mobile: res.result.data.phoneNumber })
            if (result.code) {
              loginSuccess(result.data)
              univerifyManager.close()
            }
          })
          .catch((err) => {
            console.log('err', err)
          })
      }
    },
    fail: (err) => {
      console.log('login fail', err)
      console.log(JSON.stringify(err))
      if (err.code === 30002) {
        // 用户点击其他登录方式
        // this.otherLogin();
        univerifyManager.close()
      }
    },
  })
}

async function checkEnvironment(type: number) {
  uni.getProvider({
    service: 'oauth',
    success: (res: any) => {
      console.log(res.provider)
      if (~res.provider.indexOf('univerify')) {
        console.log('支持一键登录')
        uni.preLogin({
          provider: 'univerify',
          success: () => {
            // 预登录成功
            // 显示一键登录选项
            // 拉起运营商一键登录界面
            isSupport = true
            univerifyLogin()
            // 订阅自定义按钮点击事件
          },
          fail: (res) => {
            // 预登录失败
            // 不显示一键登录选项（或置灰）
            // 根据错误信息判断失败原因，如有需要可将错误提交给统计服务器
            if (type === 1) {
              console.log(res)
              console.log('与登录', Object.keys(errorList).includes(res.errCode.toString()))
              if (Object.keys(errorList).includes(res.errCode.toString())) {
                uni.showToast({
                  title: errorList[res.errCode as 30005 | 20202 | 5000],
                  icon: 'none',
                  duration: 3000,
                })
              } else {
                uni.showToast({
                  title: '设备不支持一键登录',
                  icon: 'none',
                  duration: 3000,
                })
              }
              isSupport = false
            }
            console.warn(res.errCode)
            console.warn(res.errMsg)
          },
        })
      }
    },
  })
}

async function CheckBoxState() {
  // 参数和 uni.getCheckBoxState 相同
  univerifyManager.getCheckBoxState({
    success(res) {
      console.log('getCheckBoxState res: ', res)
      if (res.state) {
        // 关闭一键登录弹框
        // 参数和 uni.closeAuthView 相同
        univerifyManager.close()
      }
    },
  })
}

export {
  aweixin,
  isSupport,
  getService,
  fFilterOauth,
  univerifyLogin,
  checkEnvironment,
  CheckBoxState,
}
